<?php

require_once dirname(__FILE__).'/../lib/usuarioGeneratorConfiguration.class.php';

class UsuarioActions extends autoUsuarioActions
{

	public function getCredential()
	{
		return 'Usuario';
	}

	public function getFilterInfo()
	{
		$filters = $this->getFilters();

		if (!$filters)
			return null;

		$info = array();
		$info[] = array('label' => 'Nombres:', 'value' => $filters['first_name']['text']);
		$info[] = array('label' => 'Apellidos:', 'value' => $filters['last_name']['text']);
		$info[] = array('label' => 'Login', 'value' => $filters['username']['text']);
		$info[] = array('label' => 'Email', 'value' => $filters['email_address']['text']);
		$info[] = array('label' => 'Activo', 'value' => ($filters['is_active'] === '1' ? 'Si' : ($filters['is_active'] === '0' ? 'No' : '' )));

		return $info;
	}

	public function executeBuscar(sfWebRequest $request)
	{
		if ($request->isXmlHttpRequest())
		{
			$value = $request->getParameter('value');

			if (isset($value[3])) //longitud mínima
			{
				$resultados = sfGuardUserTable::getInstance()->findByValue($value);
				$json_data = array();
				foreach ($resultados as $usuario)
					$json_data[] = array('id' => $usuario->id, 'value' => $usuario->__toString());

				return $this->renderText(json_encode($json_data));
			}

			return $this->renderText(json_encode(array()));
		}
		else
			$this->forward404('Acceso incorrecto');
	}

	public function executeShow(sfWebRequest $request)
	{
		parent::executeShow($request);
		$this->docente = DocenteTable::getInstance()->findOneBy('usuario_id', $request->getParameter('id'));
	}

	public function executeDocente(sfWebRequest $request)
	{
		$usuario_id = $request->getParameter('id');
		$docente = new Docente();
		$docente->usuario_id = $usuario_id;
		try
		{
			$docente->save();
			$this->getUser()->setFlash('notice', 'El docente se ha creado correctamente.');
			$this->redirect('@docente_show?id=' . $docente->id);
		}
		catch (Doctrine_Exception $error)
		{
			$this->getUser()->setFlash('error', 'El docente no se ha creado porque se ha producido algún error.');
			$this->redirect('@usuario_show?id=' . $usuario_id);
		}
	}

	public function executeCarreras(sfWebRequest $request)
	{
		$id = $request->getParameter('id');

		$this->user = sfGuardUserTable::getInstance()->find($id);
		$this->forward404Unless($this->user);

		$this->pager = $this->configuration->getPager('CarreraUsuario');

		$this->pager->setQuery(CarreraUsuarioTable::getInstance()->getUserAccessQuery($id));

		if ($request->hasParameter('page'))
			$this->pager->setPage($request->getParameter('page'));
		else
			$this->pager->setPage(0);

		$this->pager->init();
	}

	public function executeAddCarrera(sfWebRequest $request)
	{
		$object = new CarreraUsuario();
		$object->usuario_id = $request->getParameter('id');

		$this->form = new CarreraUsuarioForm($object);

		if ($request->isMethod('post'))
			$this->createCarrera($request, $this->form);
	}

	private function createCarrera(sfWebRequest $request, $form)
	{
		$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

		if ($form->isValid())
		{
			$values = $form->getValues();

			$notice = 'El acceso se ha agregado correctamente.';

			try {
				$carrera_usuario = $form->save();
			} catch (Doctrine_Validator_Exception $e) {
				$errorStack = $form->getObject()->getErrorStack();

				$message = get_class($form->getObject()) . ' has ' . count($errorStack) . " field" . (count($errorStack) > 1 ?	's' : null) . " with validation errors: ";
				foreach ($errorStack as $field => $errors) {
					$message .= "$field (" . implode(", ", $errors) . "), ";
				}
				$message = trim($message, ', ');

				$this->getUser()->setFlash('error', $message);
				return sfView::SUCCESS;
			}

			$this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $carrera_usuario)));

			if ($request->hasParameter('_save_and_add'))
			{
				$this->getUser()->setFlash('notice', $notice.' Ahora puede agregar otro');

				$this->redirect('@usuario_addCarrera?id=' . $carrera_usuario->usuario_id);
			}
			else
			{
				$this->getUser()->setFlash('notice', $notice);
				$this->redirect('@usuario_carreras?id=' . $carrera_usuario->usuario_id);
			}
		}
		else
		{
			$this->getUser()->setFlash('error', 'El acceso no se ha agregado porque se ha producido algún error.', false);
		}
	}

	public function executeDeleteCarrera(sfWebRequest $request)
	{
		$request->checkCSRFProtection();

		$user_id = $request->getParameter('id');
		$carrera_id = $request->getParameter('carrera');

		$carrera_usuario = CarreraUsuarioTable::getInstance()->getCarreraUsuario($carrera_id, $user_id);

		if ($carrera_usuario->delete())
			$this->getUser()->setFlash('notice','El acceso a la carrera ha sido eliminado');

		$this->redirect('@usuario_carreras?id=' . $user_id);
	}

	public function executeBatchCarrera(sfWebRequest $request)
	{
		$request->checkCSRFProtection();

		$user_id = $request->getParameter('user_id');

		if (!$ids = $request->getParameter('ids'))
		{
			$this->getUser()->setFlash('error', 'Debe seleccionar al menos una carrera.');

			$this->redirect('@usuario_carreras?id=' . $user_id);
		}

		if (!$action = $request->getParameter('batch_action'))
		{
			$this->getUser()->setFlash('error', 'Seleccione la acción que quiera ejecutar sobre las carreras seleccionadas.');

			$this->redirect('@usuario_carreras?id=' . $user_id);
		}

		if (!$this->getUser()->hasCredential($this->configuration->getCredentials($action)))
		{
			$this->forward(sfConfig::get('sf_secure_module'), sfConfig::get('sf_secure_action'));
		}

		try
		{
			$method = 'execute' . ucfirst($action);
			$this->$method($request);
		}
		catch (sfValidatorError $e)
		{
			$this->getUser()->setFlash('error', 'No se pudo realizar la acción');
		}

		$this->redirect('@usuario_carreras?id=' . $user_id);
	}

	public function executeBatchDeleteCarreras(sfWebRequest $request)
	{
		$ids = $request->getParameter('ids');
		$user_id = $request->getParameter('user_id');

		$records = CarreraUsuarioTable::getInstance()->getCarrerasList($user_id, $ids);

		foreach ($records as $record)
		{
			$record->delete();
		}

		$this->getUser()->setFlash('notice', 'Los accesos a las carreras seleccionadas han sido eliminados.');
		$this->redirect('@usuario_carreras?id=' . $user_id);
	}

}
